
semaphore mutex = 1; // 控制甲和乙互斥使用 1 把铁锹
semaphore empty = 3; // 表示甲可以挖树坑的数量
semaphore full = 0; // 表示树坑的数量
semaphore sem_乙丙 = 0; // 用户控制乙和丙执行顺序

甲() {
    while (TRUE) {
        wait(empty); // 如果有 3 个树坑，则阻塞
        wait(mutex); // 互斥使用铁锹
        挖坑;
        signal(mutex);
        signal(full); // 通知乙，可以放树苗了
    }
}

乙() {
    while (TRUE) {
        wait(full); // 等待甲挖坑完成
        放树苗;
        wait(mutex); // 互斥使用铁锹
        填土;
        signal(mutex);
        signal(empty); // 通知甲，可以挖坑了
        signal(sem_乙丙); // 通知丙，可以浇水了
    }
}

丙() {
    while (TRUE) {
        wait(sem_乙丙); // 等待丙填土完成
        浇水;
    }
}

